package arrayOps

import C "gitee.com/ljfirst/algo-go-sdk/common/constant"

/**
 * @author ljfirst
 * @version V1.0
 * @date 2023/7/15 17:21
 * @author-Email ljfirst@mail.ustc.edu.cn
 * @blogURL https://blog.csdn.net/ljfirst
 * @description 给定一个数组 A[0,1,…,n-1]，请构建一个数组 B[0,1,…,n-1]，
 * 其中B[i] 的值是数组 A 中除了下标 i 以外的元素的积, 即B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法
 **/
type GapMulti struct {
}

func (m *GapMulti) Method(array []int) []int {
	if len(array) == 0 {
		return array
	}
	ans := make([]int, len(array), len(array))
	ans[0] = 1
	for i := 1; i < len(array); i++ {
		ans[i] = ans[i-1] * array[i-1]
	}
	help := array[len(array)-1]
	for i := len(array) - 2; i >= 0; i-- {
		ans[i] *= help
		help *= array[i]
	}
	return ans
}

func (m *GapMulti) GetAttribute() *C.Attribute {
	return &C.Attribute{
		Tags: []string{C.GapMulti},
		Desc: &C.Desc{
			Name:        "GapMulti",
			NameCn:      "",
			Description: "给定一个数组 A[0,1,…,n-1]，请构建一个数组 B[0,1,…,n-1]，其中B[i] 的值是数组 A 中除了下标 i 以外的元素的积, 即B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法",
			ParamsDesc: map[string]string{
			},
			Example: map[int]string{
				1: "输入: [1,2,3,4,5]，输出: [120,60,40,30,24]",
			},
		},
	}
}
